% Copyright 2011 by Alain Matthes
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.


\def\fileversion{1.13 c}
\def\filedate{2011/01/19}


%<--------------------------------------------------------------------------–>
% Objet :  tools for arithmetic 
%<--------------------------------------------------------------------------–>
%    [About integers numbers]
%<--------------------------------------------------------------------------–>
\ProvidesFile{tkz-tool-arith.tex}[tkz-tool-arith 1.13 c]
\edef\tkzAtCode{\the\catcode`\@} 
\catcode`\@=11\relax
%<--------------------------------------------------------------------------–>
%                            arithmetic tools 
%<--------------------------------------------------------------------------–>

\tkzutil@ifundefined{pgfmath@function@gcd}{%
\pgfmathdeclarefunction{gcd}{2}{%
 \begingroup%
 \pgfmathcontinuelooptrue
    \pgfmath@xa=#1pt\relax%
    \pgfmath@xb=#2pt\relax%
    \ifdim\pgfmath@xa=0pt \pgfmathcontinueloopfalse
     \pgfmath@xa=\pgfmath@xb
    \fi 
     \ifdim\pgfmath@xb=0pt \pgfmathcontinueloopfalse
       \pgfmath@xb=\pgfmath@xa
    \fi
\loop
\ifpgfmathcontinueloop 
 \ifdim \pgfmath@xa=\pgfmath@xb\pgfmathcontinueloopfalse
 \else
  \ifdim \pgfmath@xa>\pgfmath@xb 
   \advance \pgfmath@xa by-\pgfmath@xb
  \else 
   \advance \pgfmath@xb by-\pgfmath@xa
  \fi
  \fi
  \repeat
  \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@xa}}%
  \pgfmath@smuggleone\pgfmathresult
  \endgroup
}
}{} 
%<--------------------------------------------------------------------------->

\tkzutil@ifundefined{pgfmath@function@isprime}{%
\newif\ifpgf@unknown
\newif\ifpgf@isaprime    
\pgfmathdeclarefunction{isprime}{1}{%
	\begingroup%
\pgf@unknowntrue
\c@pgfmath@counta#1\relax% 
 \ifcase#1\relax 
 % |#1| = 0 
 \pgf@isaprimefalse\pgf@unknownfalse
 \or
 % |#1| = 1
  \pgf@isaprimefalse\pgf@unknownfalse
  \or
% |#1| = 2
  \pgf@isaprimetrue\pgf@unknownfalse
 \or
% |#1| = 3
  \pgf@isaprimetrue\pgf@unknownfalse
   \else
 % |#1| > 3
   \ifodd#1\relax 
   \else
    \pgf@isaprimefalse\pgf@unknownfalse
   \fi
 \fi  
\ifpgf@unknown
\c@pgfmath@countd=\thr@@ \pgf@isaprimetrue
 \loop
 \c@pgfmath@countb=\c@pgfmath@counta  
 \divide\c@pgfmath@countb by\c@pgfmath@countd
  \ifnum\c@pgfmath@countb>\c@pgfmath@countd \pgf@unknowntrue
  \else\pgf@unknownfalse\fi
    \multiply\c@pgfmath@countb by\c@pgfmath@countd
  \ifnum\c@pgfmath@countb=\c@pgfmath@counta  
   \global\pgf@isaprimefalse\pgf@unknownfalse\fi
  \ifpgf@unknown\advance\c@pgfmath@countd by 2\relax% 
 \repeat
\fi
\ifpgf@isaprime
  \def\pgfmathresult{1}%
\else
  \def\pgfmathresult{0}%
\fi
 \pgfmath@smuggleone\pgfmathresult%
\endgroup
}}{}  
%<--------------------------------------------------------------------------->
\tkzutil@ifundefined{pgfmath@function@isodd}{%   
\pgfmathdeclarefunction{isodd}{1}{%  
\begingroup
\ifodd #1 \def\pgfmathresult{1}%
\else\def\pgfmathresult{0}%
\fi
 \pgfmath@smuggleone\pgfmathresult%
\endgroup}
}{}  
%<--------------------------------------------------------------------------->
\pgfmathdeclarefunction{isfactor}{2}{%  
\begingroup 
\c@pgfmath@counta#1\relax%   
\c@pgfmath@countb#2\relax%   
\c@pgfmath@countc#1\relax%
\divide\c@pgfmath@counta by\c@pgfmath@countb%
\multiply\c@pgfmath@counta by\c@pgfmath@countb% 
\advance\c@pgfmath@countc by-\c@pgfmath@counta%
\ifnum\c@pgfmath@countc=0 \def\pgfmathresult{1}%
\else
  \def\pgfmathresult{0}%
  \fi
\pgfmath@smuggleone\pgfmathresult%
\endgroup}
%<--------------------------------------------------------------------------->
\def\tkzfactors#1{% 
\begingroup
\c@pgfmath@countb#1 
\pgfmathisprime{\c@pgfmath@countb}% 
\ifnum\pgfmathresult=1 
   \number\c@pgfmath@countb\ % prime number
\else% we can found factors
\tkz@factors{#1} 
\fi
\endgroup}% 
%<--------------------------------------------------------------------------–>
\def\tkz@factors#1{%
\begingroup
\c@pgfmath@countb#1 
\c@pgfmath@countd2\relax
 \loop
 \ifodd\c@pgfmath@countb\relax% 
 \else
  \divide\c@pgfmath@countb by2 %
   \number\c@pgfmath@countd\ % 
 \repeat%
%%%%%%%%%%%%%%
\def\tkzprim@last{1}%
\loop% first loop
  \ifnum\c@pgfmath@countb>1\relax
    \c@pgfmath@countd\tkzprim@last\relax
    \c@pgfmath@countc1\relax
%%%%%%%%%%%%%%
\tkz@find@last
%%%%%%%%%%%%%%
   \divide\c@pgfmath@countb by\c@pgfmath@countd\relax
   \number\c@pgfmath@countd\ %  affiche le facteur
\repeat% end first loop
%%%%%%%%%%%%%%   
\endgroup%
}%
%<--------------------------------------------------------------------------->
\def\tkz@find@last{%
     \ifnum\c@pgfmath@countc>\z@
     \edef\tkzprim@last{\the\c@pgfmath@countd}%
     \advance\c@pgfmath@countd by2\relax% begins with 3
     \c@pgfmath@counta\c@pgfmath@countb% macro mod !!
     \c@pgfmath@countc\c@pgfmath@counta%
     \divide\c@pgfmath@counta by\c@pgfmath@countd
     \multiply\c@pgfmath@counta by\c@pgfmath@countd
     \advance\c@pgfmath@countc by-\c@pgfmath@counta
      \let\tkz@find@next=\tkz@find@last
     \else
     \let\tkz@find@next=\relax%   
     \fi
     \tkz@find@next
}%
%<--------------------------------------------------------------------------->
%<--------------------------------------------------------------------------->
\def\tkzReducFrac#1#2{% 
\begingroup
\ifnum#1<0\relax%
   \c@pgfmath@counta=0\relax 
   \advance\c@pgfmath@counta by-#1
 \else
    \c@pgfmath@counta#1
 \fi
    \c@pgfmath@countb#2
    \pgfmathgcd{\c@pgfmath@counta}{\c@pgfmath@countb}%
    \pgfmathsetcount\c@pgfmath@countc{\pgfmathresult}
 \ifnum\c@pgfmath@counta=0\relax
   \c@pgfmath@counta#1
   \c@pgfmath@countb#2
 \else 
   \c@pgfmath@counta#1
   \c@pgfmath@countb#2
   \divide\c@pgfmath@counta by\c@pgfmath@countc%
   \divide\c@pgfmath@countb by\c@pgfmath@countc%
 \fi
\global\edef\tkzMathFirstResult{\the\c@pgfmath@counta}
\global\edef\tkzMathSecondResult{\the\c@pgfmath@countb} 
\endgroup}
%<--------------------------------------------------------------------------->
%<--------------------------------------------------------------------------->
%<--------------------------------------------------------------------------->

\catcode`\@=\tkzAtCode\relax 
\endinput


